package com.spielpark.steve.bernieapp.tasks;
import android.content.Context;
import android.os.AsyncTask;
import android.text.Html;
import android.util.JsonReader;
import android.util.JsonToken;
import android.util.Log;
import android.widget.ArrayAdapter;
import com.spielpark.steve.bernieapp.R;
import com.spielpark.steve.bernieapp.fragments.ConnectFragment;
import com.spielpark.steve.bernieapp.wrappers.Event;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
/**
* Created by Steve on 7/8/2015.
*/
public class ConnectTask extends AsyncTask {
private static ArrayList<Event> events;
private static Context ctx;
private static ConnectFragment frag;
public ConnectTask(Context ctx, ConnectFragment frag) {
this.frag = frag;
this.ctx = ctx;
}
public static ArrayList<Event> getEvents() {
return events;
}
@Override
protected Object doInBackground(Object[] params) {
events = new ArrayList<>();
BufferedReader in = null;
try {
URL url = frag.fetchCountry ?
new URL("https://go.berniesanders.com/page/event/search_results?orderby=date&format=json") :
new URL("https://go.berniesanders.com/page/event/search_results?orderby=date&format=json&zip_radius=" + frag.mRadius + "&zip=" + frag.mZip);
Log.d("URL", url.toString());
in = new BufferedReader(new InputStreamReader(url.openStream()));
} catch (IOException e) {
e.printStackTrace();
}
if (in == null) {
Log.d("reader null", "no events, null reader,");
Event e = new Event();
e.setName("Unable to Load News");
e.setDescription("Check your internet connection?");
events.add(e);
return null;
}
JsonReader reader = new JsonReader(in);
try {
readObjects(reader);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Log.d("OPE", "There are " + events.size() + " events.");
Collections.sort(events);
String[] titles = new String[events.size()];
for (int i = 0; i < events.size(); i++) {
titles[i] = getHTMLForTitle(events.get(i));
}
NewsAdapter adapter = new NewsAdapter(ctx, R.layout.list_news_item, R.id.txtItem, titles);
frag.setMarkers();
frag.updateViews(adapter);
frag = null;
}
private void formatDate(Event e) {
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = ft.parse(e.getDate());
e.setDate(new SimpleDateFormat("MMMM d, yyyy").format(date));
} catch (ParseException e1) {
e1.printStackTrace();
}
}
private String getHTMLForTitle(Event e) {
StringBuilder bld = new StringBuilder();
bld.append("<big><font color =\"#147FD7\">").append(e.getName()).append("</font></big><br>");
if (e.getVenue_city() != null) {
bld.append(" ").append(e.getVenue_city()).append(", ").append(e.getState()).append(" - ").append(e.getZip()).append("<br>");
bld.append(" # of RSVP: ").append(e.isOfficial() ? "N/A" : Integer.toString(e.getAttendee_count()));
}
return bld.toString();
}
private void readObjects(JsonReader reader) throws IOException {
Log.d("JsonReader", "Beginning parsing");
Event e = new Event();
while (reader.hasNext()) {
if (isCancelled()) {
return;
}
if (reader.peek() == JsonToken.END_OBJECT) {
Log.d("Adding..", "Adding event: " + e.getName());
formatDate(e);
events.add(e);
e = new Event();
reader.endObject();
}
if (reader.peek() == JsonToken.BEGIN_OBJECT) {
reader.beginObject();
}
String next = reader.nextName();
switch(next.toLowerCase().trim()) {
case "results" : {
reader.beginArray();
if (reader.peek() == JsonToken.END_ARRAY) {
//There's no events~!
e.setName("No events in your area!");
e.setDescription("Perhaps you want to create one? Visit www.berniesanders.com!");
events.add(e);
return;
}
reader.beginObject();
break;
}
case "name" : {
e.setName(reader.nextString());
break;
}
case "start_day" : {
e.setDate(reader.nextString());
break;
}
case "start_time" : {
e.setTime(reader.nextString());
break;
}
case "url" : {
e.setUrl(reader.nextString().replaceAll("\\\\", ""));
break;
}
case "timezone" : {
e.setTimezone(reader.nextString());
break;
}
case "description" : {
e.setDescription(reader.nextString());
break;
}
case "event_type_name" : {
e.setEventType(reader.nextString());
break;
}
case "venue_name" : {
e.setVenue(reader.nextString());
break;
}
case "venue_state_cd" : {
e.setState(reader.nextString());
break;
}
case "venue_addr1" : {
e.setVenue_addr(reader.nextString());
break;
}
case "venue_city" : {
e.setVenue_city(reader.nextString());
break;
}
case "venue_zip" : {
String zipped = reader.nextString().substring(0, 5);
e.setZip(Integer.parseInt(zipped));
break;
}
case "capacity" : {
e.setCapacity(reader.nextInt());
break;
}
case "latitude" : {
e.setLatitude(reader.nextDouble());
break;
}
case "longitude" : {
e.setLongitude(reader.nextDouble());
break;
}
case "is_official" : {
e.setOfficial(reader.nextInt() == 1);
break;
}
case "closed_msg" : {
reader.skipValue(); //consume and throw away
if (reader.peek() == JsonToken.END_OBJECT) {
formatDate(e);
events.add(e);
e = new Event();
reader.endObject();
}
break;
}
case "attendee_count" : {
e.setAttendee_count(reader.nextInt());
formatDate(e);
events.add(e);
e = new Event();
reader.endObject();
break;
}
default: {
reader.skipValue();
}
}
}
reader.close();
}
private class NewsAdapter extends ArrayAdapter {
private NewsAdapter(Context context, int resource, int textViewResourceId, Object[] objects) {
super(context, resource, textViewResourceId, objects);
}
@Override
public Object getItem(int position) {
return Html.fromHtml( (String) super.getItem(position));
}
}
}